package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedList;


import educar.db.DbConnection;
import educar.db.JPA;

public class Docente extends Persona
{

    private static JPA jpa = new JPA();
    private String cubiculo;
    private String cv;
    private String telInterno;
    
    private Docente(String ape, String nom, String dniP,String email, String telPersonal, String pais, String provincia, String ciudad, String direccion, String foto,String cub,String cvit,String telI)
    {
        super(ape, nom, dniP,email,telPersonal,pais, provincia, ciudad,direccion,foto);
        this.cubiculo = cub;
        this.cv = cvit;
        this.telInterno = telI;
    }


    public boolean save()
    {
        super.save();

        try
        {
            getDocenteByDni(super.getDni());
            return false;
        }
        catch (docenteNotFound e1)
        {
            String[] columns = { "dniDocente","cubiculo","cv","telInterno"};
            PreparedStatement stm = jpa.newRecord(DbConnection.bd+".docente", columns);
            try
            {
                stm.setString(1, super.getDni());
                stm.setString(2, cubiculo);
                stm.setString(3, cv);
                stm.setString(4, telInterno);
            }
            catch (SQLException e)
            {
                e.printStackTrace();
                return false;
            }

            jpa.create(stm);
            return true;
        }
    }

    public LinkedList<Materia> getMateriasAsignadas()
    {
        LinkedList<Materia> l = new LinkedList<Materia>();
        ResultSet rs;
        rs = jpa.getByField("asigna", "dniDocent", getDni());
        try
        {
            while (rs.next())
            {
                try
                {
                    l.add(Materia.getMateriabyCodigo(rs.getString(1)));
                }
                catch (materiaNotFound e)
                {
                    e.printStackTrace();
                }
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        l.addAll(Materia.getAllByResponsable(this));

        return l;
    }

    public String[] getMateriasAsignadasArray()
    {
        LinkedList<Materia> l = getMateriasAsignadas();
        String[] materias = new String[l.size()];
        for (int i = 0; i < l.size(); i++)
            materias[i] = l.get(i).toString();

        return materias;
    }

    public static Docente getDocenteByDni(String dni) throws docenteNotFound
    {
        Docente docente = null;
        ResultSet rs = null;
        Persona p = null;

        rs = jpa.getByField("docente", "dniDocente", dni);
        try
        {
            if (rs.next())
            {
                try
                {
                    p = Persona.getPersonaByDni(dni);
                }
                catch (personaNotFound e)
                {
                    throw new docenteNotFound();
                }
                docente = new Docente(p.getApellido(), p.getNombre(), p.getDni(),p.getEmail(),p.getTelPersonal(),p.getPais(),p.getProvincia(),p.getCiudad(),p.getDireccion(),p.getFoto(), rs.getString(2),rs.getString(3),rs.getString(4));
            }
            else
            {
                throw new docenteNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return docente;
    }


    public static LinkedList<Docente> getAll()
    {
        Persona p = null;
        Docente d = null;
        ResultSet rs = null;
        LinkedList<Docente> docentes = new LinkedList<Docente>();
        rs = jpa.showAll("docente");
        try
        {
            while (rs.next())
            {
                try
                {
                    p = Persona.getPersonaByDni(rs.getString(1));
                    d = new Docente(p.getApellido(), p.getNombre(), p.getDni(),p.getEmail(),p.getTelPersonal(),p.getPais(),p.getProvincia(),p.getCiudad(),p.getDireccion(),p.getFoto(),rs.getString(2),rs.getString(3),rs.getString(4));
                    docentes.add(d);
                }
                catch (personaNotFound e)
                {}
            }

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return docentes;
    }

    public void destroy()
    {
        jpa.destroy("docente", "dniDocente", getDni());
    }

    private ResultSet getRowByDniFacultad(String dni, String facultad)
    {
        ResultSet rs = null;

        HashMap<String, String> columns = new HashMap<String, String>();
        columns.put("codigoFacu", facultad);
        columns.put("dniD", dni);

        rs = jpa.genericSelect("pertenece", columns);

        return rs;
    }

    public Boolean actualizarCargoXFacultad(String codCargo, String codFacultad, String dedicacion)
    {
        ResultSet rs = getRowByDniFacultad(this.getDni(), codFacultad);
        Boolean rta = false;
        try
        {
            if (rs.next())
            {
                HashMap<String, String> m = new HashMap<String, String>();
                m.put("codigoFacu", codFacultad);
                m.put("codigoDeCargo", codCargo);
                m.put("dedicacion", dedicacion);
                jpa.genericUpdate("pertenece", m, "dniD", this.getDni());
                rta = true;
            }
        }
        catch (SQLException s1)
        {
        }
        return rta;
    }

    public Boolean asignarCargoXFacultad(String codCargo, String codFacultad, String dedicacion)
    {
        String[] columns = { "codigoFacu", "dniD", "codigoDeCargo", "dedicacion" };
        PreparedStatement stm = jpa.newRecord(DbConnection.bd+".pertenece", columns);
        try
        {
            stm.setString(1, codFacultad);
            stm.setString(2, this.getDni());
            stm.setString(3, codCargo);
            stm.setString(4, dedicacion);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return false;
        }

        jpa.create(stm);

        return true;
    }

    public void destroyPersona()
    {
        //el motor de bd automaticamente borra la persona de la tabla alumno
        super.destroy();
    }


    public static String[] getAllArray()
    {
        LinkedList<Docente> l = getAll(); //TODO: pedir unicamente la columa nombre a la db
        String[] docentes = new String[l.size()];
        for (int i = 0; i < l.size(); i++)
            docentes[i] = l.get(i).toString();

        return docentes;
    }
    
    /**
     * 
     * @param cub el cubiculo del docente
     */
    public void setCubiculo(String cub)
    {
        cubiculo =  cub;
    }

    /**
     * 
     * @return el cubiculo del docente
     */
    public String getCubiculo()
    {
        return this.cubiculo;
    }
    
    /**
     * 
     * @param dir el cv que se le quiere settear al docente
     */
    public void setCv(String cvit)
    {
        cv =  cvit;
    }

    /**
     * 
     * @return el cv del docente
     */
    public String getCv()
    {
        return this.cv;
    }
    
    /**
     * 
     * @param telI el tel interno que se le quiere settear al docente
     */
    public void setTelInterno(String telI)
    {
        telInterno =  telI;
    }

    /**
     * 
     * @return la foto de la persona
     */
    public String getTelInterno()
    {
        return this.telInterno;
    }

    /**
     * Destruye en la base de datos esta persona
     */
}